有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java关于同步的重要性

这可能是一个愚蠢的问题,但我对Java中的多线程编程还不熟悉。我创建了4个线程,然后对它们调用run方法。在run方法中,我使用一个数组,并为它的索引赋值。我看到每个线程都在维护自己的数组副本,并且没有线程不安全的行为。我只是想知道在这种情况下,使用同步的意义是什么?(我以为它是用来控制对共享资源的访问。这里的数组不应该是共享数据结构吗?)


共 (4) 个答案

  1. # 1 楼答案

    只要您完全确定数组是完全不同的(这里需要小心,因为根据您所做的操作,可能会有指向同一对象的指针),那么就不需要同步数组

  2. # 2 楼答案

    否——如果每个线程使用自己的数组副本,那么您有四个单独的数组,它们恰好包含相同的数据,但没有共享

    如果您有一个数组,并且所有四个线程都在该数组上运行,并且至少有可能两个线程同时使用相同的数据,那么共享就是。在这种情况下,您需要进行同步,以确保其中只有一个在任何时间尝试(例如)写入任何特定位置(或者,如果一个在读,另一个在写,写是原子化的,读要么完全在写之前发生,要么完全在写之后发生——但不允许两者重叠)

  3. # 3 楼答案

    这取决于您所说的“在run方法中我正在使用数组”(强调使用数组)是什么意思?如果已将数组引用传递给线程,则“是”,同步将阻止同时访问数组。但是,如果您在线程中的数组上创建一个实例,那么您有4个单独的数组实例,并且同步没有效果

  4. # 4 楼答案

    如果线程只对自己的私有数据执行操作,则不需要同步

    顺便说一下,您说您在线程上“调用了run方法”;调用线程。不过,run()不会直接在新线程中执行逻辑;您需要调用线程。改为start()(它在单独的线程中内部执行run()